package top.yj95.kecwv.job;

import static java.util.stream.Collectors.*;

import java.time.LocalDateTime;
import java.util.List;

import top.yj95.kecwv.util.CollUtils;
import top.yj95.kecwv.util.ProcUtils;

/**
 * 终止 Eclipse 系列进程下的 WebView2 子进程任务
 * @author 杨军
 * @since 2025-07-10
 */
public class KillEclipseChildrenWebView2Job implements Runnable {
    
    @Override
    public void run() {
        try {
            System.out.printf("[%s]KillEclipseChildrenWebView2Job 开始运行...\n", LocalDateTime.now().toString());
            List<ProcessHandle> procs = ProcUtils.findEclipseSeries(); // 查找 Eclipse 系列进程
            if (CollUtils.isEmpty(procs)) {
                System.out.println("无 Eclipse 系列进程");
                return;
            }
            int cnt = 0;
            // 遍历 Eclipse 系列进程，获取它们的子进程，筛选出 WebView2 进程并终止它
            for (ProcessHandle proc : procs) {
                // 获取子进程并筛选 WebView2 进程
                List<ProcessHandle> wv2s = proc.children().filter(ProcUtils::isWebView2Proc).collect(toList());
                if (CollUtils.isEmpty(wv2s)) {
                    continue;
                }
                ++cnt;
                long pid = proc.pid();
                String command = proc.info().command().orElse(null);
                System.out.printf("正在终止 [%d]%s 下的 WebView2 子进程...\n", pid, command);
                // 结束 WebView2 进程
                for (ProcessHandle wv2Proc : wv2s) {
                    try {
                        System.out.printf("正在终止 WebView2 子进程：[%d]\n", wv2Proc.pid());
                        wv2Proc.destroy();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                System.out.println();
            }
            if (cnt <= 0) {
                System.out.println("没有需要终止的 WebView2 进程");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println();
        }
    }
    
}
